import { isEmpty } from 'lodash-es'

import { routesMap } from './index'

/** 从url中获取全部参数 */
export const getUrlParams = search => {
  const params = {}
  if (search) {
    search
      .substring(1)
      .split('&')
      .forEach(keyValue => {
        if (!keyValue) return
        const [key, value] = keyValue.split('=')
        params[key] = JSON.parse(decodeURIComponent(value))
      })
  }
  return params
}

/** 根据参数获取对应url的字符串 */
export const getUrlParamsStr = (params = {}) =>
  Object.keys(params)
    .map(key => `${key}=${encodeURIComponent(JSON.stringify(params[key]))}`)
    .join('&')

/**
 * @typedef {Object} Params
 * @property {string} [topMenuName] 头部菜单需要展示的文案，不传默认为配置的菜单名
 * @property {boolean} [cover] 覆盖当前页面的头部菜单
 */

/**
 * 跳转
 * @param {string} pageKey
 * @param {Params} params
 */
export const navigateTo = (pageKey, params) => {
  window.dvaApp?._history?.push(
    `${routesMap[pageKey]?.path || `/${pageKey}`}${isEmpty(params) ? '' : `?${getUrlParamsStr(params)}`}`,
  )
}

/**
 * 重定向
 * @param {string} pageKey
 * @param {Params} params
 */
export const redirectTo = (pageKey, params) => {
  window.dvaApp?._history?.replace(
    `${routesMap[pageKey]?.path || `/${pageKey}`}${isEmpty(params) ? '' : `?${getUrlParamsStr(params)}`}`,
  )
}

/**
 * 返回到某页，不重置页面state
 * @param {string} pageKey
 * @param {Params} params
 */
export const navigateBack = (pageKey, params) => {
  if (pageKey) {
    window.dvaApp?._history?.push(
      `${routesMap[pageKey]?.path || `/${pageKey}`}?${getUrlParamsStr({ action: 'back', ...params })}`,
    )
  } else {
    window.dvaApp?._history?.go(-1)
  }
}

/**
 * window.open方法被拦截
 * 当window.open为用户触发事件内部或者加载时，不会被拦截，
 * 一旦将弹出代码移动到ajax或者一段异步代码内部，马上就出现被拦截的表现了。
 */
export const windowNewOpen = (pageKey, params) => {
  if (!pageKey) {
    console.error('请传入pageKey')
    return
  }
  let a = document.getElementById('newOpen')
  // 防止反复添加
  if (!a) {
    a = document.createElement('a')
    a.setAttribute('target', '_blank')
    a.setAttribute('id', 'newOpen')
    document.body.appendChild(a)
  }

  a.setAttribute(
    'href',
    `${window.location.pathname}#${routesMap[pageKey].path}${isEmpty(params) ? '' : `?${getUrlParamsStr(params)}`}`,
  )
  a.click()
}
